﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entities;
using System.Data;
using Microsoft.ApplicationBlocks.Data;
using System.Transactions;

namespace DAL
{
    public class ProductoDAL
    {
        public static string strConexion = System.Configuration.ConfigurationManager.ConnectionStrings["ConexionBaseDesarrollo"].ConnectionString;

        public static long Nuevo(Producto parProducto)
        {
            using (TransactionScope tScope = new TransactionScope())
            {
                try
                {
                    //guardamos el Producto
                    long longRetorno = long.Parse(SqlHelper.ExecuteScalar(strConexion, "spProductoNuevo",
                    parProducto.SubCategoria.IDSubCategoria,
                    parProducto.Negocio.IDNegocio,
                    parProducto.NombreProducto,
                    parProducto.Descripcion,
                    parProducto.Precio,
                    parProducto.Marca,
                    parProducto.FechaCarga,
                    parProducto.Imagen
                    ).ToString());
                    tScope.Complete();
                    return longRetorno;
                }
                catch (Exception ex)
                {
                    tScope.Dispose();
                    throw ex;
                }
            }
        }

        public static void Modificar(Producto parProducto)
        {
            SqlHelper.ExecuteNonQuery(strConexion, "spProductoModificar",
            parProducto.IDProducto,
            parProducto.SubCategoria.IDSubCategoria,
            parProducto.Negocio.IDNegocio,
            parProducto.NombreProducto,
            parProducto.Descripcion,
            parProducto.Precio,
            parProducto.Marca,
            parProducto.FechaCarga,
            parProducto.Imagen);
        }

        public static void Eliminar(long idProducto)
        {
            SqlHelper.ExecuteNonQuery(strConexion, "spProductoEliminar", idProducto);
        }

        public static Producto BuscarUno (long parIDProducto )
        {
            try
            {
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spProductoBuscarUno", parIDProducto).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    Producto oProducto = new Producto();
                    DataRow dr = dt.Rows[0];
                    oProducto.IDProducto = long.Parse(dr["idProducto"].ToString());
                    oProducto.SubCategoria  = SubCategoria.ObtenerUno(long.Parse(dr["IDSubCategoria"].ToString()));
                    oProducto.Negocio = Negocio.BuscarUno(long.Parse(dr["IDNegocio"].ToString()), false);
                    oProducto.NombreProducto = dr["NombreProducto"].ToString();
                    oProducto.Descripcion = dr["Descripcion"].ToString();
                    oProducto.Precio = Decimal.Parse( dr["Precio"].ToString());
                    oProducto.Marca = dr["Marca"].ToString();
                    oProducto.FechaCarga = DateTime.Parse(dr["FechaCarga"].ToString());
                    if (dr["Imagen"] != DBNull.Value)
                    {
                        oProducto.Imagen = (byte[])dr["Imagen"];
                    }
                    return oProducto;
                }
                //sino retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                //TODO Falta Agragarle el LOG!!
                throw ex;
            }
        }

        public static List<Producto> BuscarPorNegocio(long parIDNegocio)
        {
            try
            {
                List<Producto> ListaProductos = new List<Producto>();
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spProductoBuscarPorNegocio", parIDNegocio).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Producto oProducto = new Producto();
                        oProducto.IDProducto = long.Parse(dr["idProducto"].ToString());
                        oProducto.SubCategoria = SubCategoria.ObtenerUno(long.Parse(dr["IDSubCategoria"].ToString()));
                        oProducto.Negocio = Negocio.BuscarUno(long.Parse(dr["IDNegocio"].ToString()), false);
                        oProducto.NombreProducto = dr["NombreProducto"].ToString();
                        oProducto.Descripcion = dr["Descripcion"].ToString();
                        oProducto.Precio = Decimal.Parse(dr["Precio"].ToString());
                        oProducto.Marca = dr["Marca"].ToString();
                        oProducto.FechaCarga = DateTime.Parse(dr["FechaCarga"].ToString());
                        if (dr["Imagen"] != DBNull.Value)
                        {
                            oProducto.Imagen = (byte[])dr["Imagen"];
                        }
                        ListaProductos.Add(oProducto);
                    }
                    return ListaProductos;
                }
                //sino retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                //TODO Falta Agragarle el LOG!!
                throw ex;
            }
        }

        public static List<Producto> BuscarPoroductosNoPublicados (long parIDNegocio)
        {
            try
            {
                List<Producto> ListaProductos = new List<Producto>();
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spProductoBuscarNoPublicadosPorIDNegocio", parIDNegocio).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Producto oProducto = new Producto();
                        oProducto.IDProducto = long.Parse(dr["idProducto"].ToString());
                        oProducto.SubCategoria = SubCategoria.ObtenerUno(long.Parse(dr["IDSubCategoria"].ToString()));
                        oProducto.Negocio = Negocio.BuscarUno(long.Parse(dr["IDNegocio"].ToString()), false);
                        oProducto.NombreProducto = dr["NombreProducto"].ToString();
                        oProducto.Descripcion = dr["Descripcion"].ToString();
                        oProducto.Precio = Decimal.Parse(dr["Precio"].ToString());
                        oProducto.Marca = dr["Marca"].ToString();
                        oProducto.FechaCarga = DateTime.Parse(dr["FechaCarga"].ToString());
                        if (dr["Imagen"] != DBNull.Value)
                        {
                            oProducto.Imagen = (byte[])dr["Imagen"];
                        }
                        ListaProductos.Add(oProducto);
                    }
                    return ListaProductos;
                }
                //sino retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                //TODO Falta Agragarle el LOG!!
                throw ex;
            }
        }

        public static List<Producto> BuscarPorCategoria (long parIDCategoria)
        {
            try
            {
                List<Producto> ListaProductos = new List<Producto>();
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spProductoBuscarPorCategoria", parIDCategoria).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Producto oProducto = new Producto();
                        oProducto.IDProducto = long.Parse(dr["idProducto"].ToString());
                        oProducto.SubCategoria = SubCategoria.ObtenerUno(long.Parse(dr["IDSubCategoria"].ToString()));
                        oProducto.Negocio = Negocio.BuscarUno(long.Parse(dr["IDNegocio"].ToString()), false);
                        oProducto.NombreProducto = dr["NombreProducto"].ToString();
                        oProducto.Descripcion = dr["Descripcion"].ToString();
                        oProducto.Precio = Decimal.Parse(dr["Precio"].ToString());
                        oProducto.Marca = dr["Marca"].ToString();
                        oProducto.FechaCarga = DateTime.Parse(dr["FechaCarga"].ToString());
                        if (dr["Imagen"] != DBNull.Value)
                        {
                            oProducto.Imagen = (byte[])dr["Imagen"];
                        }
                        ListaProductos.Add(oProducto);
                    }
                    return ListaProductos;
                }
                //sino retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                //TODO Falta Agragarle el LOG!!
                throw ex;
            }
        }

        public static List<Producto> BuscarPorSubCategoria (long parIDSubCategoria)
        {
            try
            {
                List<Producto> ListaProductos = new List<Producto>();
                DataTable dt = new DataTable();
                dt = SqlHelper.ExecuteDataset(strConexion, "spProductoBuscarPorSubCategoria", parIDSubCategoria).Tables[0];
                if (dt.Rows.Count > 0)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        Producto oProducto = new Producto();
                        oProducto.IDProducto = long.Parse(dr["idProducto"].ToString());
                        oProducto.SubCategoria = SubCategoria.ObtenerUno(long.Parse(dr["IDSubCategoria"].ToString()));
                        oProducto.Negocio = Negocio.BuscarUno(long.Parse(dr["IDNegocio"].ToString()), false);
                        oProducto.NombreProducto = dr["NombreProducto"].ToString();
                        oProducto.Descripcion = dr["Descripcion"].ToString();
                        oProducto.Precio = Decimal.Parse(dr["Precio"].ToString());
                        oProducto.Marca = dr["Marca"].ToString();
                        oProducto.FechaCarga = DateTime.Parse(dr["FechaCarga"].ToString());
                        if (dr["Imagen"] != DBNull.Value)
                        {
                            oProducto.Imagen = (byte[])dr["Imagen"];
                        }
                        ListaProductos.Add(oProducto);
                    }
                    return ListaProductos;
                }
                //sino retorna Null
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                //TODO Falta Agragarle el LOG!!
                throw ex;
            }
        }
    }
}
